import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; // 引入 mocktail
import 'package:shared_preferences/shared_preferences.dart';
import 'package:qq/main.dart'; // 导入你的 main.dart
import 'package:qq/home_page.dart'; // 导入主页面

class MockSharedPreferences extends Mock implements SharedPreferences {}

void main() {
  group('登录测试', () {
    late MockSharedPreferences mockPrefs;

    SharedPreferences.setMockInitialValues({
      'saved_qq': '1234567890',
      'saved_password': '1234567890',
      'is_password_saved': true,
    });

    // 在每个测试前初始化 mock SharedPreferences
    setUp(() {
      mockPrefs = MockSharedPreferences();
      when(() => mockPrefs.getString(any())).thenReturn('1234567890');  // 模拟返回一个保存的密码
      when(() => mockPrefs.getBool(any())).thenReturn(true);  // 模拟返回勾选状态
      when(() => mockPrefs.setString(any(), any())).thenAnswer((_) async => true);  // 模拟保存数据
      when(() => mockPrefs.setBool(any(), any())).thenAnswer((_) async => true);  // 模拟保存勾选状态
    });

    testWidgets('登录成功', (WidgetTester tester) async {
      // 使用 mock 的 SharedPreferences 替代实际的实现
      SharedPreferences.setMockInitialValues({});

      // 1. 构建登录界面
      await tester.pumpWidget(const MyApp());

      // 2. 输入 QQ 号和密码
      await tester.enterText(find.byType(TextField).at(0), '1234567890');
      await tester.enterText(find.byType(TextField).at(1), '1234567890');

      // 3. 勾选协议复选框
      await tester.tap(find.byType(Checkbox).last);
      await tester.pump(); // 等待 UI 更新

      // 4. 点击登录按钮
      await tester.tap(find.byType(ElevatedButton));
      await tester.pumpAndSettle(); // 等待页面跳转和动画完成

    });

    testWidgets('登录失败（账号密码错误）', (WidgetTester tester) async {
      // 使用 mock 的 SharedPreferences 替代实际的实现
      SharedPreferences.setMockInitialValues({});

      // 1. 构建登录界面
      await tester.pumpWidget(const MyApp());

      // 2. 输入错误的 QQ 号和密码
      await tester.enterText(find.byType(TextField).at(0), '123456789');
      await tester.enterText(find.byType(TextField).at(1), '123456');

      // 3. 勾选协议复选框
      await tester.tap(find.byType(Checkbox).last);
      await tester.pump(); // 等待 UI 更新

      // 4. 点击登录按钮
      await tester.tap(find.byType(ElevatedButton));
      await tester.pumpAndSettle(); // 等待 UI 更新

      // 5. 验证是否显示错误信息
      expect(find.text('QQ号或密码错误，请重新输入'), findsOneWidget);
    });

    testWidgets('未勾选协议框', (WidgetTester tester) async {
      // 使用 mock 的 SharedPreferences 替代实际的实现
      SharedPreferences.setMockInitialValues({});

      // 1. 构建登录界面
      await tester.pumpWidget(const MyApp());

      // 2. 输入 QQ 号和密码
      await tester.enterText(find.byType(TextField).at(0), '1234567890');
      await tester.enterText(find.byType(TextField).at(1), '1234567890');

      // 3. 不勾选协议复选框
      // 不做任何勾选

      // 4. 点击登录按钮
      await tester.tap(find.byType(ElevatedButton));
      await tester.pumpAndSettle(); // 等待 UI 更新

      // 5. 验证是否显示协议未勾选的错误信息
      expect(find.text('请阅读并同意服务协议和隐私保护指引'), findsOneWidget);
    });
  });
}
